/* Arquivo fonte retirado do projeto SIGA-RENAPI sob Licença Pública Geral GNU,
 * adapatado para satisfazer as necessidades arquiteturais desta aplicação.
 */
package br.edu.ifrn.utils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CriptografiaUtil {

	private static final String ALGORITMO_HASH = "SHA-256";
	
	private MessageDigest md5;
	
	private static CriptografiaUtil singleton;
	
	private CriptografiaUtil() {
		try {
			md5 = MessageDigest.getInstance(ALGORITMO_HASH);
		} catch (NoSuchAlgorithmException e) {
			System.err.println("Algoritmo de hash inválido: " + e.getMessage());
		}
	}
	
	public static CriptografiaUtil obterInstancia(){
		if(singleton == null){
			singleton = new CriptografiaUtil();
		}
		return singleton;		
	}

	public byte[] criptografarComMD5(byte[] bytesACriptografar) {
		if (bytesACriptografar == null) {
			throw new NullPointerException("A senha não pode ser null");
		}
//		if (null == md) { md = MessageDigest.getInstance(ALGORITHM); }
//		md.reset();
//		byte pwdb[] = new byte[pwd.length];
//		for (int b = 0; b < pwd.length; b++) {
//			pwdb[b] = (byte) pwd[b];
//		}
//		char crypt[] = hexDump(md.digest(pwdb));
//		smudge(pwdb);
//		return crypt;		
		return this.md5.digest(bytesACriptografar);
	}
	
	public String criptografarComMD5(String stringACriptografar) {
		byte[] bytesACriptografar = stringACriptografar.getBytes();
		BigInteger hash = new BigInteger(1, criptografarComMD5(bytesACriptografar));
		String stringCriptografada = hash.toString(16);
		if (stringCriptografada.length() % 2 != 0)
			stringCriptografada = String.valueOf(0) + stringCriptografada;
		return stringCriptografada;
	}

	public static String md5ToString(byte[] md5) {
		BigInteger hash = new BigInteger(1, md5);
		String s = hash.toString(16);
		if (s.length() % 2 != 0)
			s = String.valueOf(0) + s;
		return s;
	}
	
}
